package com.cs.beneficios.business.entity;

import com.cs.beneficios.business.model.UsuarioxSedeVO;
import com.cs.beneficios.business.model.Beneficiario_AtributoVO;
import com.cs.beneficios.common.ConnectionFactory;
//import java.sql.BatchUpdateException;
import java.sql.Connection;
//import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
//import java.util.HashMap;
import java.util.List;
//import java.util.Vector;
//import java.sql.PreparedStatement;
//import java.util.Iterator;

import com.cs.beneficios.business.model.BeneficioVO;

//import com.cs.beneficios.business.model.SubProgramaVO;

public class BeneficioDAO {

	/**
	 * Conexion a la base de datos.
	 */
	private Connection conn = null;
	private ConnectionFactory cf;

	/**
	 * Constructor que inicializa la conexion con la base de datos.
	 * 
	 * @param conn
	 *            Conexion con la base de datos.
	 */

	public BeneficioDAO(ConnectionFactory cf) {
		this.cf = cf;
		try {
			this.conn = this.cf.getConnection();
		} catch (SQLException e) {
		}
	}

	public boolean checkBeneficio(Long codeSede, Long codeSubpro)
			throws SQLException {
		String query = "select NUMERO_BEN_DISPONIBLE "
				+ "from TCS_BEN_SUBPROGRAMA_SEDE " + "where ";
		boolean retorno = false;
		if ((Object) codeSede != null && (Object) codeSubpro != null) {
			query += " SEDE_CODIGO = " + codeSede + " and SBPR_CODIGO = "
					+ codeSubpro;
			// System.out.println(query);
			ResultSet rst = cf.getRecordsRset(query, null, conn);
			if (rst.next()) {
				int disponibles = rst.getInt("NUMERO_BEN_DISPONIBLE");
				if (disponibles > 0) {
					retorno = true;
				}
			}
		}
		return retorno;
	}

	/*
	 * public boolean checkVigencia(Long codeSede, Long codeSub) throws
	 * SQLException { String query =
	 * "SELECT COUNT(1) FROM VCS_BEN_SEDES WHERE CODIGO ="
	 * +codeSede+" AND CODSUB = "+codeSub;
	 * 
	 * ResultSet rst = cf.getRecordsRset(query, null, conn);
	 * 
	 * if(rst.next()){ if(rst.getInt(1) == 0){ return false; }else{ return true;
	 * } }
	 * 
	 * return false;
	 * 
	 * }
	 */

	public Collection getUsuarioxBeneficio(String idben) {

		String query = "SELECT PRG.NOMBRE PROGRAMA,SUB .NOMBRE SUBPROGRAMA,SEDE.NOMBRE, USU.NOMBRE USUARIO "
				+ "FROM TCS_BEN_PROGRAMA PRG, TCS_BEN_SUBPROGRAMA SUB, TCS_BEN_SEDE SEDE, TCS_BEN_SUBPROGRAMA_SEDE SUBSEDE, TCS_BEN_USUARIO_SEDE USUSEDE, PAOYER.TCS_USUARIO USU "
				+ "WHERE PRG.CODIGO = SUB. PRG_CODIGO AND SUB.CODIGO = SUBSEDE. SBPR_CODIGO AND SEDE.CODIGO = SUBSEDE. SEDE_CODIGO AND SUBSEDE.CODIGO = USUSEDE. SPSE_CODIGO AND USU.CODIGO = USUSEDE. USU_CODIGO "
				+ "AND SUB.CODIGO =" + idben;

		ResultSet rst = null;
		ArrayList Usuarios = new ArrayList();
		try {
			rst = cf.getRecordsRset(query, null, conn);
			UsuarioxSedeVO usu = null;
			while (rst.next()) {
				usu = new UsuarioxSedeVO();
				usu.setNombreUsuario(rst.getString("USUARIO"));
				// usu.setCodeUsuario(new Long(rst.getString("codeusu")));
				usu.setNombrePrograma(rst.getString("PROGRAMA"));
				usu.setNombreSubprograma(rst.getString("SUBPROGRAMA"));
				Usuarios.add(usu);
				usu = null;

			}
			rst.close();

		} catch (SQLException e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
		}

		return Usuarios;

	}

	public String getPrograma(String codeSubprograma) throws SQLException {
		String strSql = "SELECT PRG_CODIGO " + " FROM TCS_BEN_SUBPROGRAMA "
				+ " WHERE CODIGO =" + codeSubprograma;

		ResultSet rst = null;
		rst = cf.getRecordsRset(strSql, null, conn);

		rst.next();

		return rst.getString("PRG_CODIGO");
	}

	public boolean renewBeneficio(Long codeSubpro, Long codeBeneficiario,
			Long codeOldSede, Long codeNewSede, String fechaOtorgamiento)
			throws SQLException {
		boolean retorno = true;
		if ((Object) codeSubpro != null && (Object) codeBeneficiario != null
				&& (Object) codeNewSede != null) {
			if (checkBeneficio(codeNewSede, codeSubpro)) {
				String query = " INSERT INTO TCS_BEN_BENEFICIO_OTORGADO "
						+ " (CODIGO, SBPR_CODIGO, BEN_CODIGO, "
						+ " SEDE_CODIGO, FECHA_BENEFICIO) "
						+ " VALUES (SCS_BEN_BOT.NextVal," + codeSubpro + ","
						+ codeBeneficiario + "," + codeNewSede
						+ ",to_char(sysdate,'dd/mm/rrrr')) ";

				int iRegInsert = cf.execSql(query, null, conn);
				if (iRegInsert > 0) {
					query = "select SCS_BEN_BOT.currval codigo from dual ";
					ResultSet max = null;
					max = cf.getRecordsRset(query, null, conn);
					if (max.next()) {
						Long codeBotNuevo = new Long(max.getLong("codigo"));
						query = "select codigo from TCS_BEN_SUBP_ATR_BENEFICIARIO "
								+ "where SBPR_CODIGO = "
								+ codeSubpro
								+ " and TIPO_ATRIBUTO = 'B' ";
						ResultSet rst = null;
						rst = cf.getRecordsRset(query, null, conn);
						query = "select codigo "
								+ "from TCS_BEN_BENEFICIO_OTORGADO "
								+ "where SBPR_CODIGO = " + codeSubpro
								+ " and BEN_CODIGO = " + codeBeneficiario
								+ " and SEDE_CODIGO = " + codeOldSede
								+ " and FECHA_BENEFICIO = to_date('"
								+ fechaOtorgamiento + "')";
						ResultSet rst1 = null;

						rst1 = cf.getRecordsRset(query, null, conn);
						if (rst1.next()) {
							while (rst.next()) {
								if (updateBeneficioAtributo(
										new Long(rst.getLong("codigo")),
										codeBotNuevo,
										new Long(rst1.getLong("codigo")))) {
									retorno = true;
								} else {
									retorno = false;
									break;
								}
							}
							query = "update TCS_BEN_BENEFICIO_OTORGADO set campo_a1 = 'I' where codigo = "
									+ rst1.getLong("codigo");

							int iReg = cf.execSql(query, null, conn);
							if (iReg > 0)
								retorno = true;
							else
								retorno = false;
						} else {
							retorno = false;
						}

					}

				} else
					retorno = false;
			} else
				retorno = false;
		}
		if (!retorno)
			conn.rollback();
		else {
			updateBeneficioDisponible(codeNewSede, codeSubpro);
		}
		return retorno;
	}

	public void updateBeneficioDisponible(Long codeSede, Long codeSubpro)
			throws SQLException {
		String query = "";
		if ((Object) codeSede != null && (Object) codeSubpro != null) {
			query = "select max(codigo) codigo from tcs_ben_subprograma_sede "
					+ "where sbpr_codigo = " + codeSubpro
					+ " and sede_codigo = " + codeSede;
			ResultSet rst = cf.getRecordsRset(query, null, conn);
			if (rst.next()) {
				query = "update  TCS_BEN_SUBPROGRAMA_SEDE "
						+ "set NUMERO_BEN_DISPONIBLE = NUMERO_BEN_DISPONIBLE - 1 "
						+ "where codigo = " + rst.getString("codigo");
				int iReg = cf.execSql(query, null, conn);
			}
		}
	}

	public void aumentarBeneficioDisponible(String codeSede, Long codeSubpro)
			throws SQLException {
		String query = "";
		if ((Object) codeSede != null && (Object) codeSubpro != null) {
			query = "select max(codigo) codigo from tcs_ben_subprograma_sede "
					+ "where sbpr_codigo = " + codeSubpro
					+ " and sede_codigo = " + codeSede;
			ResultSet rst = cf.getRecordsRset(query, null, conn);
			if (rst.next()) {
				query = "update  TCS_BEN_SUBPROGRAMA_SEDE "
						+ "set NUMERO_BEN_DISPONIBLE = NUMERO_BEN_DISPONIBLE + 1 "
						+ "where codigo = " + rst.getString("codigo");
				int iReg = cf.execSql(query, null, conn);
			}
		}
	}

	public boolean updateBeneficioAtributo(Long codeAtributo,
			Long codeBotNuevo, Long codeBotViejo) throws SQLException {
		String query = "update TCS_BEN_BENEFICIO_ATRIBUTO set bot_codigo="
				+ codeBotNuevo + " where BOT_CODIGO = " + codeBotViejo
				+ " and SAB_CODIGO = " + codeAtributo;
		int iRegUpdate = cf.execSql(query, null, conn);
		if (iRegUpdate > 0)
			return true;
		else
			return false;
	}

	/**
	 * @autor Felipe
	 * @param Codigobene
	 * @return
	 * @throws java.sql.SQLException
	 */
	public boolean GetExisteBeneficiario(String Codigobene, String CodSub)
			throws SQLException {
		int CodigoBeneficiario = Integer.parseInt(Codigobene.trim());
		int CodigoSubprograma = Integer.parseInt(CodSub.trim());
		boolean retorno = false;
		String query = "SELECT CODIGO FROM TCS_BEN_BENEFICIO_OTORGADO "
				+ "WHERE BEN_CODIGO=" + CodigoBeneficiario + " "
				+ "AND SBPR_CODIGO=" + CodigoSubprograma
				+ " AND campo_a1 IS NULL ";

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);

		if (rst.next()) {
			retorno = true;
		}
		rst.close();
		return retorno;
	}

	public String getCostBenefit(String strCodeBene) throws SQLException {
		String query = "SELECT NVL(TRUNC(VALOR_UNITARIO_BENEFICIO),0) VALOR_UNITARIO_BENEFICIO FROM TCS_BEN_SUBPROGRAMA "
				+ "WHERE CODIGO = " + strCodeBene;

		String strCost = null;
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			strCost = rst.getString("VALOR_UNITARIO_BENEFICIO");
		} else {
			strCost = "0";
		}

		return strCost;
	}

	public String getCostBOT(String strCodeBot) throws SQLException {
		String query = "SELECT VALOR FROM VCS_BENEFICIOS_OTORGADOS "
				+ "WHERE CODBOT = " + strCodeBot;

		String strCost = null;
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			strCost = "" + rst.getInt("VALOR");
		} else {
			strCost = "0";
		}

		return strCost;
	}

	public String getFechaBOT(String strCodeBot) throws SQLException {
		String query = "SELECT to_char(to_date(fecha, 'dd/mm/rrrr'), 'dd/mm/rrrr') fechaBOT "
				+ "FROM VCS_BENEFICIOS_OTORGADOS "
				+ "WHERE CODBOT = "
				+ strCodeBot;

		String strCost = null;
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			strCost = rst.getString("fechaBOT");
		}

		return strCost;
	}

	public String getTercero(String strCodeBot) throws SQLException {
		String query = "SELECT trim(TERCERO) tercer"
				+ " FROM TCS_BEN_BENEFICIO_OTORGADO " + " WHERE CODIGO= "
				+ strCodeBot;

		String strTercero = null;
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			strTercero = rst.getString("tercer");
		}

		return strTercero;
	}

	/**
	 * Autor Andres Cespedes, Devuelve el campo tipo beneficio correspondiente a
	 * la PK enviada de un BOT.
	 * 
	 * @param strCodeBot
	 * @return
	 * @throws SQLException
	 */
	public String getTipoBeneficio(String strCodeBot) throws SQLException {
		String query = "SELECT trim(TIPO_BENEFICIO) tipo"
				+ " FROM TCS_BEN_BENEFICIO_OTORGADO " + " WHERE CODIGO= "
				+ strCodeBot;

		String strTipo = null;
		ResultSet rst = null;
		// System.out.println("query: " + query);
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			strTipo = rst.getString("tipo");
		}

		return strTipo;
	}

	public int GetDisponibilidad(String Codigosede, String CodigoSubpro)
			throws SQLException {
		int CodSede = Integer.parseInt(Codigosede.trim());
		int CodSubpro = Integer.parseInt(CodigoSubpro.trim());
		int retorno = 0;
		String query = "SELECT NUMERO_BEN_DISPONIBLE "
				+ "FROM TCS_BEN_SUBPROGRAMA_SEDE " + "WHERE SEDE_CODIGO="
				+ CodSede + " " + "AND SBPR_CODIGO=" + CodSubpro + " ";

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			retorno = rst.getInt("NUMERO_BEN_DISPONIBLE");
		}
		rst.close();
		return retorno;
	}

	public boolean OtorgarBeneficios(Long codeSede, Long codeSubpro,
			Long codeBeneficiario, List lListaInsertar, String Tercero, int i,
			String strArrIns[], String CostBenefit, String DateBenefit)
			throws SQLException {
		boolean retorno = true;

		boolean cantidad = checkBeneficio(codeSede, codeSubpro);
		// boolean vigenciaSede = checkVigencia(codeSede, codeSubpro);
		boolean sw = false;
		String strCodeSede = codeSede + "";
		String strCodeSubpro = codeSubpro + "";
		String strCodeBeneficiario = codeBeneficiario + "";

		if (cantidad)// && vigenciaSede)
		{
			SubProgramaDAO objSubProgramaDAO;
			int tamanoinsert = lListaInsertar.size();

			// proceso para insertar en la tabla beneficio otorgado
			String strArr[] = { strCodeSubpro, strCodeBeneficiario,
					strCodeSede, Tercero, CostBenefit, strArrIns[0],
					strArrIns[1], strArrIns[0], strArrIns[1] };

			objSubProgramaDAO = new SubProgramaDAO(cf);
			int insertbienBeneOtorgado = objSubProgramaDAO
					.InsetBeneficioOtorgado(strArr, i, DateBenefit);
			// fin del proceso

			if (Tercero == null) {
				sw = true;
			} else {
				if (Tercero.equals("")) {
					sw = true;
				}
			}

			// Proceso para actualizar la cantidad disponible
			if (sw) {
				updateBeneficioDisponible(codeSede, codeSubpro);
			}
			// fin del proceso

			// proceso para calcular el codigo maximo en la tabla beneficio
			// otorgado
			String CodMaxBenefOtor = objSubProgramaDAO.CodMaxBenOtor();
			cf.closeConnection(objSubProgramaDAO.getConn());
			// fin del proceso

			AtributosDAO objAtributoDAO = new AtributosDAO(cf);
			for (int j = 0; j < tamanoinsert; j++) {
				Beneficiario_AtributoVO objBenAtri = (Beneficiario_AtributoVO) lListaInsertar
						.get(j);

				if (objBenAtri.getVariable().trim().equals("") == false) {
					System.err
							.println("[BeneficioDAO.OtorgarBeneficios]tipo atributo="
									+ objBenAtri.getTipoatributo());
					if ((objBenAtri.getTipoatributo()).equals("R")) {
						int insertobeneficiarioatri = objAtributoDAO
								.InsertBeneficiarioAtri(objBenAtri
										.getVariable().trim(), objBenAtri
										.getTipodato(), objBenAtri
										.getCodigoatributo(), objBenAtri
										.getCodbeneficiario(), i, strArrIns);

					} else {
						int insertobeneficioatri = objAtributoDAO
								.InsertBeneficioAtri(objBenAtri.getVariable()
										.trim(), objBenAtri.getTipodato(),
										objBenAtri.getCodigoatributo(),
										CodMaxBenefOtor, i, strArrIns);

					}
				}
			}
			cf.closeConnection(objAtributoDAO.getConn());
		} else {
			return retorno = false;
		}
		return retorno;
	}

	/**
	 * 
	 * @param codeSede
	 * @param codeSubpro
	 * @param codeBeneficiario
	 * @param lListaInsertar
	 * @param Tercero
	 * @param i
	 * @param strArrIns
	 * @param CostBenefit
	 * @param DateBenefit
	 * @return
	 * @throws SQLException
	 */
	public boolean OtorgarBeneficios(Long codeSede, Long codeSubpro,
			Long codeBeneficiario, List lListaInsertar, String Tercero, int i,
			String strArrIns[], String CostBenefit, String DateBenefit,
			String TypeBenefit) throws SQLException {
		boolean retorno = true;

		boolean cantidad = checkBeneficio(codeSede, codeSubpro);
		// boolean vigenciaSede = checkVigencia(codeSede, codeSubpro);
		boolean sw = false;
		String strCodeSede = codeSede + "";
		String strCodeSubpro = codeSubpro + "";
		String strCodeBeneficiario = codeBeneficiario + "";

		if (cantidad)// && vigenciaSede)
		{
			SubProgramaDAO objSubProgramaDAO;
			int tamanoinsert = lListaInsertar.size();

			// proceso para insertar en la tabla beneficio otorgado
			String strArr[] = { strCodeSubpro, strCodeBeneficiario,
					strCodeSede, Tercero, CostBenefit, TypeBenefit,
					strArrIns[0], strArrIns[1], strArrIns[0], strArrIns[1] };

			objSubProgramaDAO = new SubProgramaDAO(cf);
			int insertbienBeneOtorgado = objSubProgramaDAO
					.InsetBeneficioOtorgado(strArr, i, DateBenefit);
			// fin del proceso

			if (Tercero == null) {
				sw = true;
			} else {
				if (Tercero.equals("")) {
					sw = true;
				}
			}

			// Proceso para actualizar la cantidad disponible
			if (sw) {
				updateBeneficioDisponible(codeSede, codeSubpro);
			}
			// fin del proceso

			// proceso para calcular el codigo maximo en la tabla beneficio
			// otorgado
			String CodMaxBenefOtor = objSubProgramaDAO.CodMaxBenOtor();
			cf.closeConnection(objSubProgramaDAO.getConn());
			// fin del proceso

			AtributosDAO objAtributoDAO = new AtributosDAO(cf);
			for (int j = 0; j < tamanoinsert; j++) {
				Beneficiario_AtributoVO objBenAtri = (Beneficiario_AtributoVO) lListaInsertar
						.get(j);

				if (objBenAtri.getVariable().trim().equals("") == false) {
					System.err
							.println("[BeneficioDAO.OtorgarBeneficios]tipo atributo="
									+ objBenAtri.getTipoatributo());
					if ((objBenAtri.getTipoatributo()).equals("R")) {
						int insertobeneficiarioatri = objAtributoDAO
								.InsertBeneficiarioAtri(objBenAtri
										.getVariable().trim(), objBenAtri
										.getTipodato(), objBenAtri
										.getCodigoatributo(), objBenAtri
										.getCodbeneficiario(), i, strArrIns);

					} else {
						int insertobeneficioatri = objAtributoDAO
								.InsertBeneficioAtri(objBenAtri.getVariable()
										.trim(), objBenAtri.getTipodato(),
										objBenAtri.getCodigoatributo(),
										CodMaxBenefOtor, i, strArrIns);

					}
				}
			}
			cf.closeConnection(objAtributoDAO.getConn());
		} else {
			return retorno = false;
		}
		return retorno;
	}

	// FIN! OTORGAR BENEFICIO CON ADICION DE TIPO BENEFICIO

	public boolean UpdateBOT(String codeSede, Long codeSubpro,
			Long codeBeneficiario, List lListaInsertar, String Tercero, int i,
			String strArrIns[], String CostBenefit, String DateBenefit,
			String codeBot, String codeSedeOld) throws SQLException {
		boolean retorno = true;
		boolean cantidad = false;

		if (codeSede.equals(codeSedeOld)) {
			cantidad = true;
		} else {
			cantidad = checkBeneficio(new Long(codeSede), codeSubpro);
		}

		boolean sw = false;

		if (cantidad) {
			SubProgramaDAO objSubProgramaDAO;
			int tamanoinsert = lListaInsertar.size();

			// proceso para actualizar en la tabla beneficio otorgado
			String strArr[] = { codeSede, Tercero, CostBenefit, strArrIns[0],
					strArrIns[1] };

			objSubProgramaDAO = new SubProgramaDAO(cf);
			int updated = objSubProgramaDAO.updateBeneficioOtorgado(strArr, i,
					DateBenefit, codeBot);
			// fin del proceso

			if (updated == 1) {
				if (Tercero == null) {
					sw = true;
				} else {
					if (Tercero.equals("")) {
						sw = true;
					}
				}

				// Proceso para actualizar la cantidad disponible
				if (sw && !codeSede.equals(codeSedeOld)) {
					// Para disminuir en uno el numero de beneficios
					// disponibles en la nueva sede
					updateBeneficioDisponible(new Long(codeSede), codeSubpro);

					// Para aumentar en uno el numero de beneficios
					// disponibles en la nueva sede
					aumentarBeneficioDisponible(codeSedeOld, codeSubpro);
				}
				// fin del proceso

				AtributosDAO objAtributoDAO = new AtributosDAO(cf);
				for (int j = 0; j < tamanoinsert; j++) {
					Beneficiario_AtributoVO objBenAtri = (Beneficiario_AtributoVO) lListaInsertar
							.get(j);
					// System.err.println("[BeneficioDAO.UpdateBOT]tipo atributo="
					// + objBenAtri.getTipoatributo());
					if ((objBenAtri.getTipoatributo()).equals("R")) {
						int updatedbeneficiarioatri = objAtributoDAO
								.InsertBeneficiarioAtri(objBenAtri
										.getVariable().trim(), objBenAtri
										.getTipodato(), objBenAtri
										.getCodigoatributo(), objBenAtri
										.getCodbeneficiario(), i, strArrIns);

					} else {
						int updatedbeneficioatri = objAtributoDAO
								.updateBeneficioAtri(objBenAtri.getVariable()
										.trim(), objBenAtri.getTipodato(),
										objBenAtri.getCodigoatributo(),
										codeBot, i, strArrIns);

					}
				}
				cf.closeConnection(objAtributoDAO.getConn());
			} else {
				return retorno = false;
			}

		} else {
			return retorno = false;
		}
		return retorno;
	}

	/**
	 * Actualiza el Bot despues de hacer la inclusion del atributo
	 * tipo_beneficio para la tabla BOT.
	 * 
	 * @param codeSede
	 * @param codeSubpro
	 * @param codeBeneficiario
	 * @param lListaInsertar
	 * @param Tercero
	 * @param i
	 * @param strArrIns
	 * @param CostBenefit
	 * @param DateBenefit
	 * @param codeBot
	 * @param codeSedeOld
	 * @param tipoBot
	 * @return
	 * @throws SQLException
	 */
	public boolean UpdateBOT(String codeSede, Long codeSubpro,
			Long codeBeneficiario, List lListaInsertar, String Tercero, int i,
			String strArrIns[], String CostBenefit, String DateBenefit,
			String codeBot, String codeSedeOld, String tipoBot)
			throws SQLException {
		boolean retorno = true;
		boolean cantidad = false;

		if (codeSede.equals(codeSedeOld)) {
			cantidad = true;
		} else {
			cantidad = checkBeneficio(new Long(codeSede), codeSubpro);
		}

		boolean sw = false;

		if (cantidad) {
			SubProgramaDAO objSubProgramaDAO;
			int tamanoinsert = lListaInsertar.size();

			// proceso para actualizar en la tabla beneficio otorgado
			String strArr[] = { codeSede, Tercero, CostBenefit, strArrIns[0],
					strArrIns[1] };

			objSubProgramaDAO = new SubProgramaDAO(cf);
			int updated = objSubProgramaDAO.updateBeneficioOtorgado(strArr, i,
					DateBenefit, codeBot, tipoBot);
			// fin del proceso

			if (updated == 1) {
				if (Tercero == null) {
					sw = true;
				} else {
					if (Tercero.equals("")) {
						sw = true;
					}
				}

				// Proceso para actualizar la cantidad disponible
				if (sw && !codeSede.equals(codeSedeOld)) {
					// Para disminuir en uno el numero de beneficios
					// disponibles en la nueva sede
					updateBeneficioDisponible(new Long(codeSede), codeSubpro);

					// Para aumentar en uno el numero de beneficios
					// disponibles en la nueva sede
					aumentarBeneficioDisponible(codeSedeOld, codeSubpro);
				}
				// fin del proceso

				AtributosDAO objAtributoDAO = new AtributosDAO(cf);
				for (int j = 0; j < tamanoinsert; j++) {
					Beneficiario_AtributoVO objBenAtri = (Beneficiario_AtributoVO) lListaInsertar
							.get(j);
					// System.err.println("[BeneficioDAO.UpdateBOT]tipo atributo="
					// + objBenAtri.getTipoatributo());
					if ((objBenAtri.getTipoatributo()).equals("R")) {
						int updatedbeneficiarioatri = objAtributoDAO
								.InsertBeneficiarioAtri(objBenAtri
										.getVariable().trim(), objBenAtri
										.getTipodato(), objBenAtri
										.getCodigoatributo(), objBenAtri
										.getCodbeneficiario(), i, strArrIns);

					} else {
						int updatedbeneficioatri = objAtributoDAO
								.updateBeneficioAtri(objBenAtri.getVariable()
										.trim(), objBenAtri.getTipodato(),
										objBenAtri.getCodigoatributo(),
										codeBot, i, strArrIns);

					}
				}
				cf.closeConnection(objAtributoDAO.getConn());
			} else {
				return retorno = false;
			}

		} else {
			return retorno = false;
		}
		return retorno;
	}

	public String getSedeBOT(String codeBot) throws SQLException {
		String query = "SELECT CODSEDE FROM VCS_BENEFICIOS_OTORGADOS "
				+ " WHERE CODBOT =" + codeBot;

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		rst.next();
		return rst.getString(1);
	}

	public Collection getDetailsBeneficios(String strCodeBen,
			String strCodeSubpro) throws SQLException {
		String query = "SELECT * FROM VCS_BENEFICIOS_OTORGADOS "
				+ "WHERE CODBEN = ? " + "AND CODSUBPROG = ? "
				+ "ORDER BY CODBOT";

		ResultSet rst = null;
		String strArray[] = { strCodeBen, strCodeSubpro };
		rst = cf.getRecordsRset(query, strArray, conn);
		BeneficioVO beneficioVO = null;
		int Total = 0;
		ArrayList beneficios = new ArrayList();
		while (rst.next()) {
			beneficioVO = new BeneficioVO();
			beneficioVO.setCode(new Long(rst.getLong("CODSUBPROG")));
			beneficioVO.setNombre(rst.getString("NOMSUBPROG"));
			beneficioVO.setFecha(rst.getString("FECHA"));
			beneficioVO.setCodSede(new Long(rst.getLong("CODSEDE")));
			beneficioVO.setNomSede(rst.getString("NOMSEDE"));
			beneficioVO.setCodeBot(new Long(rst.getLong("CODBOT")));
			beneficioVO.setValor(rst.getInt("Valor"));
			Total += rst.getDouble("Valor");
			beneficios.add(beneficioVO);
			beneficioVO = null;
		}
		if (beneficios != null && beneficios.size() > 0) {
			beneficioVO = new BeneficioVO();
			beneficioVO.setCode(new Long("0"));
			beneficioVO.setNombre("TOTAL");
			beneficioVO.setFecha("");
			beneficioVO.setCodSede(new Long("0"));
			beneficioVO.setNomSede("");
			beneficioVO.setCodeBot(new Long("0"));
			beneficioVO.setValor(Total);
			beneficios.add(beneficioVO);
		}

		rst.close();
		return beneficios;
	}

	public boolean deleteBOT(String codeBOT) throws SQLException {
		String query = " SELECT SBPR_CODIGO, SEDE_CODIGO "
				+ " FROM TCS_BEN_BENEFICIO_OTORGADO WHERE CODIGO =" + codeBOT;

		ResultSet rst = cf.getRecordsRset(query, null, conn);

		rst.next();

		String codeSede = rst.getString("SEDE_CODIGO");
		String codeSub = rst.getString("SBPR_CODIGO");

		query = " delete from tcs_ben_beneficio_atributo "
				+ " where BOT_CODIGO =" + codeBOT;

		int delete = cf.execSql(query, null, conn);

		query = " delete from tcs_ben_beneficio_otorgado " + " where codigo ="
				+ codeBOT;

		delete += cf.execSql(query, null, conn);

		if (delete > 0) {
			rst = null;
			query = "select max(codigo) codigo from tcs_ben_subprograma_sede "
					+ "where sbpr_codigo = " + codeSub + " and sede_codigo = "
					+ codeSede;

			rst = cf.getRecordsRset(query, null, conn);
			if (rst.next()) {
				query = "update  TCS_BEN_SUBPROGRAMA_SEDE "
						+ "set NUMERO_BEN_DISPONIBLE = NUMERO_BEN_DISPONIBLE + 1 "
						+ "where codigo = " + rst.getString("codigo");
				int update = cf.execSql(query, null, conn);

				if (update > 0) {
					return true;
				}
			}
		}

		return false;
	}

	public boolean ValidateDeleteBOT(String groupUserName, String nameUser,
			String codeBOT) throws SQLException {
		String query = "select count(1) cantidad "
				+ " FROM VCS_BENEFICIOS_OTORGADOS"
				+ " WHERE ('ADMINISTRADOR GENERAL' = '" + groupUserName
				+ "' OR 'SUPER USUARIO' = '" + groupUserName
				+ "' OR USUARIOCREA = '" + nameUser + "')" + " AND CODBOT = "
				+ codeBOT;

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		rst.next();

		if (rst.getInt("cantidad") > 0) {
			rst.close();
			return true;
		} else {
			rst.close();
			return false;
		}
	}

	public boolean ValidateEditBOT(String groupUserName, String nameUser,
			String codeBOT) throws SQLException {
		String query = "select count(1) cantidad "
				+ " FROM VCS_BENEFICIOS_OTORGADOS"
				+ " WHERE ('ADMINISTRADOR GENERAL' = '" + groupUserName
				+ "' OR 'SUPER USUARIO' = '" + groupUserName
				+ "' OR USUARIOCREA = '" + nameUser + "')" + " AND CODBOT = "
				+ codeBOT;

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		rst.next();

		if (rst.getInt("cantidad") > 0) {
			rst.close();
			return true;
		} else {
			rst.close();
			return false;
		}
	}

	public Connection getConn() {
		return conn;
	}

}